import { Controller, Get, Post, Body, Res, Param, Delete, UseInterceptors, UploadedFile } from '@nestjs/common';
import { UploadService } from './upload.service';
import { FileInterceptor } from '@nestjs/platform-express';
import * as path from 'path';
import * as fs from 'fs';
import type { Response } from 'express';
import { zip } from 'compressing'
@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) { }

  /**
   * 使用 UseInterceptors 装饰器  FileInterceptor是单个 读取字段名称  
   * FilesInterceptor是多个参数 
   * 使用 UploadedFile 装饰器接受file 文件
   * @returns 
   */
  @Post('image')
  @UseInterceptors(FileInterceptor('file'))
  create(@UploadedFile() file: Express.Multer.File, @Res() res) {
    console.log('文件:', file);
    res.status(200).json({ message: '上传成功', file });
  }


  @Get('download')
  download(@Res() res: Response) {

    // 正常下载图片路径数据库保存了，这里直接写死路径测试
    const url = path.join(__dirname, '../../uploads/46d35e1f3fc2dc571428039836c5f9c_1731290327607.jpg');
    // 直接使用 res.download 下载文件
    // res.download(url);
    // 指定文件名
    res.download(url, 'test.jpg');

  }

  @Get('stream')
  downloadByStream(@Res() res: Response) {
    // 正常下载图片路径数据库保存了，这里直接写死路径测试
    const url = path.join(__dirname, '../../uploads/46d35e1f3fc2dc571428039836c5f9c_1731290327607.jpg');

    // 使用 stream 流式下载
    const stream = fs.createReadStream(url);
    stream.pipe(res);
  }

  @Get('stream-zip')
  downloadByStreamZip(@Res() res: Response) {
    // 正常下载图片路径数据库保存了，这里直接写死路径测试
    const url = path.join(__dirname, '../../uploads/46d35e1f3fc2dc571428039836c5f9c_1731290327607.jpg');

    // 使用 stream 流式下载,前端需要使用 arraybuffer 接收,然后a标签下载
    const stream = new zip.Stream();
    stream.addEntry(url);

    res.setHeader('Content-Type', 'application/octet-stream');
    res.setHeader('Content-Disposition', 'attachment; filename=example.zip');
    stream.pipe(res);
  }

  @Delete('remove/:id')
  deleteImg(@Param('id') id: string, @Res() res: Response) {
    try {
      fs.unlinkSync(path.join(__dirname, `../../uploads/${id}`))
      return res.status(200).json({ message: '删除成功' + id })

    } catch (error) {
      return res.status(500).json({ message: '删除失败' + id })

    }
  }

}
